#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

#Область ОписаниеПеременных

// Строковая константа
Перем ВидОбъектаРегистрСведений;

#КонецОбласти

#Область ПрограммныйИнтерфейс

// Формирует отчет с количеством объектов всех типов метаданных в информационной базе.
// Выполняет валидацию параметров периода и подчиненных объектов, получает конфигурацию
// типов метаданных и формирует таблицу с количеством записей по каждому объекту.
//
// Параметры:
//   ДокументРезультат - ТабличныйДокумент - документ для вывода результата отчета
//   ДанныеРасшифровки - Произвольный - данные расшифровки от системы компоновки данных
//
Процедура СформироватьОтчет(ДокументРезультат, ДанныеРасшифровки) Экспорт
	
	НастройкиКомпоновщика = КомпоновщикНастроек.ПолучитьНастройки();
	
	ПараметрыПериода = ПолучитьИВалидироватьПериод(НастройкиКомпоновщика);
	ПараметрыПодчиненных = ПолучитьИВалидироватьПодчиненные(НастройкиКомпоновщика);
	
	ВнешниеНаборыДанных = Новый Структура("Таблица", 
		ПолучитьТаблицуСКоличествомОбъектов(ПараметрыПериода, ПараметрыПодчиненных));
	
	ДокументРезультат.Очистить();
	
	СхемаКомпоновкиДанных = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
	
	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
	МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, НастройкиКомпоновщика, 
		ДанныеРасшифровки);
	
	ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
	ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных, 
		ДанныеРасшифровки, Истина);
	
	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
	ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
	ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытий

// Обработчик события компоновки результата системы компоновки данных.
// Отключает стандартную обработку и передает управление собственной процедуре формирования отчета.
//
// Параметры:
//   ДокументРезультат - ТабличныйДокумент - документ для вывода результата
//   ДанныеРасшифровки - Произвольный - данные расшифровки от СКД
//   СтандартнаяОбработка - Булево - флаг стандартной обработки (передается по ссылке)
//
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	СформироватьОтчет(ДокументРезультат, ДанныеРасшифровки);
	
КонецПроцедуры

#КонецОбласти

#Область СлужебныйПрограммныйИнтерфейс

// Формирует данные элемента расшифровки
//
Функция ДанныеЭлементаРасшифровкиВызов(Форма, Расшифровка) Экспорт
	Возврат ДанныеЭлементаРасшифровки(Форма, Расшифровка);
КонецФункции

Функция НастройкиФормыОтчетаВызов(ОтчетСсылка, КлючВарианта, ОтчетОбъект) Экспорт
	Возврат НастройкиФормыОтчета(ОтчетСсылка, КлючВарианта, ОтчетОбъект);
КонецФункции

#Область РаботаСМетаданными

Функция ПолучитьТип(ТипМетаданных) Экспорт 
	
	Соответствие = Новый Соответствие;
	Соответствие.Вставить("Справочник"            , "Справочники");
	Соответствие.Вставить("Документ"              , "Документы"); 
	Соответствие.Вставить("ПланВидовХарактеристик", "ПланыВидовХарактеристик");
	Соответствие.Вставить("ПланСчетов"            , "ПланыСчетов");
	Соответствие.Вставить("ПланВидовРасчета"      , "ПланыВидовРасчета");
	Соответствие.Вставить("РегистрСведений"       , "РегистрыСведений");
	Соответствие.Вставить("РегистрНакопления"     , "РегистрыНакопления");
	Соответствие.Вставить("РегистрБухгалтерии"    , "РегистрыБухгалтерии");
	Соответствие.Вставить("РегистрРасчета"        , "РегистрыРасчета");
	Соответствие.Вставить("БизнесПроцесс"         , "БизнесПроцессы");
	Соответствие.Вставить("Задача"                , "Задачи"); 
	
	Возврат Соответствие.Получить(ТипМетаданных);
	
КонецФункции

Функция ПолучитьИмяФормы(ТипМетаданных, ИмяОбъекта) Экспорт 
	
	Если Метаданные[ТипМетаданных][ИмяОбъекта].ОсновнаяФормаСписка <> Неопределено Тогда
		Возврат Метаданные[ТипМетаданных][ИмяОбъекта].ОсновнаяФормаСписка.Имя;
	Иначе
		Возврат Неопределено;
	КонецЕсли; 
	
КонецФункции

#КонецОбласти

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

#Область ФормированиеДанныхОтчета

// Формирует итоговую таблицу с количеством объектов по всем типам метаданных.
// Перебирает все типы метаданных в порядке, определенном функцией ПолучитьПриоритетТипаМетаданных(),
// для каждого типа обрабатывает все объекты, подсчитывает количество записей с учетом 
// параметров периода и группировки по организациям.
//
// Параметры:
//   ПараметрыПериода - Структура - настройки периода для фильтрации данных
//   ПараметрыПодчиненных - Структура - настройки включения подчиненных объектов
//
// Возвращаемое значение:
//   ТаблицаЗначений - таблица с колонками: ВидОбъекта, ИмяОбъекта, СинонимОбъекта, Организация, Количество
//
Функция ПолучитьТаблицуСКоличествомОбъектов(ПараметрыПериода, ПараметрыПодчиненных)
	
	Таблица = ИнициализироватьТаблицуСКоличествомОбъектов();
	ПредставлениеПоВсемОрганизациям = "<По всем организациям>";
	
	ТипыМетаданных = ПолучитьКонфигурациюТиповМетаданных();
	Для Каждого ТипМетаданных Из ТипыМетаданных Цикл
		ДобавитьКоличествоПоТипуМетаданных(Таблица, ПредставлениеПоВсемОрганизациям, 
			ТипМетаданных.Ключ, ТипМетаданных.Значение, 
			ПараметрыПериода, ПараметрыПодчиненных);
	КонецЦикла;
	
	Возврат Таблица;
	
КонецФункции

#КонецОбласти

#Область ВалидацияПараметров

// Извлекает и валидирует параметры периода из настроек системы компоновки данных.
// Выполняет валидацию дат: если дата начала пустая, устанавливает начало текущего года,
// если дата конца пустая - конец текущего года.
//
// Параметры:
//   НастройкиКомпоновщика - НастройкиКомпоновщикаНастроекКомпоновкиДанных - настройки СКД
//
// Возвращаемое значение:
//   Структура - структура с полями:
//     - НачалоПериода - Дата - дата начала периода
//     - КонецПериода - Дата - дата конца периода  
//     - ИспользоватьПериод - Булево - флаг использования периода
//
Функция ПолучитьИВалидироватьПериод(НастройкиКомпоновщика)
	
	Результат = Новый Структура("НачалоПериода,КонецПериода,ИспользоватьПериод");
	Результат.НачалоПериода = '00010101';
	Результат.КонецПериода = '00010101';
	Результат.ИспользоватьПериод = Ложь;
	
	Период = НастройкиКомпоновщика.ПараметрыДанных.НайтиЗначениеПараметра(
		Новый ПараметрКомпоновкиДанных("Период"));
	Если Период = Неопределено Тогда
		Возврат Результат;
	КонецЕсли;
	
	ИспользоватьПериод = Период.Использование;
	НачалоПериода = Период.Значение.ДатаНачала;
	КонецПериода = Период.Значение.ДатаОкончания;
	
	Если НачалоПериода = '00010101' Тогда 
		НачалоПериода = НачалоГода(ТекущаяДатаСеанса());
	КонецЕсли;
	
	Если КонецПериода = '00010101' Тогда
		КонецПериода = КонецГода(ТекущаяДатаСеанса());
	КонецЕсли;
	
	Результат.НачалоПериода = НачалоПериода;
	Результат.КонецПериода = КонецПериода;
	Результат.ИспользоватьПериод = ИспользоватьПериод;
	
	Возврат Результат;
	
КонецФункции

// Извлекает параметр включения подчиненных регистратору объектов из настроек СКД.
// Включает подчиненные объекты только если параметр используется и его значение равно Истина.
//
// Параметры:
//   НастройкиКомпоновщика - НастройкиКомпоновщикаНастроекКомпоновкиДанных - настройки СКД
//
// Возвращаемое значение:
//   Структура - структура с полем:
//     - ВключитьПодчиненные - Булево - флаг включения подчиненных объектов
//
Функция ПолучитьИВалидироватьПодчиненные(НастройкиКомпоновщика)
	
	Результат = Новый Структура("ВключитьПодчиненные");
	Результат.ВключитьПодчиненные = Ложь;
	
	ПараметрПодчиненные = НастройкиКомпоновщика.ПараметрыДанных.НайтиЗначениеПараметра(
		Новый ПараметрКомпоновкиДанных("ВключитьПодчиненныеРегистратору"));
	Если ПараметрПодчиненные = Неопределено Тогда
		Возврат Результат;
	КонецЕсли;
	
	ИспользоватьПодчиненные = ПараметрПодчиненные.Использование;
	Результат.ВключитьПодчиненные = ИспользоватьПодчиненные И ПараметрПодчиненные.Значение;
	
	Возврат Результат;
	
КонецФункции

#КонецОбласти

#Область КонфигурацияМетаданных

// Определяет порядок сортировки типов метаданных для группировки в отчете.
// Возвращает числовой приоритет для каждого типа метаданных.
// Чем меньше число, тем выше приоритет (раньше в списке).
//
// Параметры:
//   ВидОбъекта - Строка - тип объекта метаданных
//
// Возвращаемое значение:
//   Число - приоритет типа метаданных (1-10)
//
Функция ПолучитьПриоритетТипаМетаданных(ВидОбъекта)
	
	СоответствиеПриоритетов = Новый Соответствие;
	
	// Первая группа: Справочники, Документы, Планы видов характеристик
	СоответствиеПриоритетов.Вставить("Справочник", 1);
	СоответствиеПриоритетов.Вставить("Документ", 2);
	СоответствиеПриоритетов.Вставить("ПланВидовХарактеристик", 3);
	
	// Вторая группа: Планы счетов и планы видов расчета
	СоответствиеПриоритетов.Вставить("ПланСчетов", 4);
	СоответствиеПриоритетов.Вставить("ПланВидовРасчета", 5);
	
	// Третья группа: Регистры
	СоответствиеПриоритетов.Вставить("РегистрСведений", 6);
	СоответствиеПриоритетов.Вставить("РегистрНакопления", 7);
	СоответствиеПриоритетов.Вставить("РегистрБухгалтерии", 8);
	СоответствиеПриоритетов.Вставить("РегистрРасчета", 9);
	
	// Четвертая группа: Бизнес-процессы и Задачи
	СоответствиеПриоритетов.Вставить("БизнесПроцесс", 10);
	СоответствиеПриоритетов.Вставить("Задача", 11);
	
	Приоритет = СоответствиеПриоритетов.Получить(ВидОбъекта);
	Если Приоритет = Неопределено Тогда
		Приоритет = 99; // Неизвестные типы в конец
	КонецЕсли;
	
	Возврат Приоритет;
	
КонецФункции

// Создает конфигурацию для всех типов метаданных платформы 1С:Предприятие.
// Определяет настройки обработки для каждого типа объектов: справочников, документов,
// планов, регистров, бизнес-процессов и задач.
//
// Возвращаемое значение:
//   Соответствие - соответствие с настройками для каждого типа объектов.
//   Ключ - Строка - тип объекта метаданных (например, "Справочник", "Документ").
//   Значение - Структура - конфигурация типа с полями:
//     - КоллекцияМетаданных - КоллекцияМетаданных - ссылка на коллекцию метаданных
//     - ИмяПоляПериода - Строка - имя поля для фильтрации по периоду
//     - ИспользоватьПериод - Булево - флаг использования периода
//     - ИспользоватьОрганизацию - Булево - флаг использования организации
//     - ИмяПоляОрганизации - Строка - имя поля организации
//     - ВключитьПодчиненные - Булево - флаг включения подчиненных объектов
//
Функция ПолучитьКонфигурациюТиповМетаданных()
	
	ТипыМетаданных = Новый Соответствие;
	
	// Справочники
	СтруктураСправочник = Новый Структура;
	СтруктураСправочник.Вставить("КоллекцияМетаданных", Метаданные.Справочники);
	СтруктураСправочник.Вставить("ИмяПоляПериода", "");
	СтруктураСправочник.Вставить("ИспользоватьПериод", Ложь);
	СтруктураСправочник.Вставить("ИспользоватьОрганизацию", Ложь);
	СтруктураСправочник.Вставить("ИмяПоляОрганизации", "");
	СтруктураСправочник.Вставить("ВключитьПодчиненные", Ложь);
	ТипыМетаданных.Вставить("Справочник", СтруктураСправочник);
	
	// Документы
	СтруктураДокумент = Новый Структура;
	СтруктураДокумент.Вставить("КоллекцияМетаданных", Метаданные.Документы);
	СтруктураДокумент.Вставить("ИмяПоляПериода", "Дата");
	СтруктураДокумент.Вставить("ИспользоватьПериод", Истина);
	СтруктураДокумент.Вставить("ИспользоватьОрганизацию", Истина);
	СтруктураДокумент.Вставить("ИмяПоляОрганизации", "Организация");
	СтруктураДокумент.Вставить("ВключитьПодчиненные", Ложь);
	ТипыМетаданных.Вставить("Документ", СтруктураДокумент);
	
	// Планы видов характеристик
	СтруктураПланВидовХарактеристик = Новый Структура;
	СтруктураПланВидовХарактеристик.Вставить("КоллекцияМетаданных", Метаданные.ПланыВидовХарактеристик);
	СтруктураПланВидовХарактеристик.Вставить("ИмяПоляПериода", "");
	СтруктураПланВидовХарактеристик.Вставить("ИспользоватьПериод", Ложь);
	СтруктураПланВидовХарактеристик.Вставить("ИспользоватьОрганизацию", Ложь);
	СтруктураПланВидовХарактеристик.Вставить("ИмяПоляОрганизации", "");
	СтруктураПланВидовХарактеристик.Вставить("ВключитьПодчиненные", Ложь);
	ТипыМетаданных.Вставить("ПланВидовХарактеристик", СтруктураПланВидовХарактеристик);
	
	// Планы счетов
	СтруктураПланСчетов = Новый Структура;
	СтруктураПланСчетов.Вставить("КоллекцияМетаданных", Метаданные.ПланыСчетов);
	СтруктураПланСчетов.Вставить("ИмяПоляПериода", "");
	СтруктураПланСчетов.Вставить("ИспользоватьПериод", Ложь);
	СтруктураПланСчетов.Вставить("ИспользоватьОрганизацию", Ложь);
	СтруктураПланСчетов.Вставить("ИмяПоляОрганизации", "");
	СтруктураПланСчетов.Вставить("ВключитьПодчиненные", Ложь);
	ТипыМетаданных.Вставить("ПланСчетов", СтруктураПланСчетов);
	
	// Планы видов расчета
	СтруктураПланВидовРасчета = Новый Структура;
	СтруктураПланВидовРасчета.Вставить("КоллекцияМетаданных", Метаданные.ПланыВидовРасчета);
	СтруктураПланВидовРасчета.Вставить("ИмяПоляПериода", "");
	СтруктураПланВидовРасчета.Вставить("ИспользоватьПериод", Ложь);
	СтруктураПланВидовРасчета.Вставить("ИспользоватьОрганизацию", Ложь);
	СтруктураПланВидовРасчета.Вставить("ИмяПоляОрганизации", "");
	СтруктураПланВидовРасчета.Вставить("ВключитьПодчиненные", Ложь);
	ТипыМетаданных.Вставить("ПланВидовРасчета", СтруктураПланВидовРасчета);
	
	// Регистры сведений
	СтруктураРегистрСведений = Новый Структура;
	СтруктураРегистрСведений.Вставить("КоллекцияМетаданных", Метаданные.РегистрыСведений);
	СтруктураРегистрСведений.Вставить("ИмяПоляПериода", "Период");
	СтруктураРегистрСведений.Вставить("ИспользоватьПериод", Истина);
	СтруктураРегистрСведений.Вставить("ИспользоватьОрганизацию", Истина);
	СтруктураРегистрСведений.Вставить("ИмяПоляОрганизации", "Организация");
	СтруктураРегистрСведений.Вставить("ВключитьПодчиненные", Истина);
	ТипыМетаданных.Вставить("РегистрСведений", СтруктураРегистрСведений);
	
	// Регистры накопления
	СтруктураРегистрНакопления = Новый Структура;
	СтруктураРегистрНакопления.Вставить("КоллекцияМетаданных", Метаданные.РегистрыНакопления);
	СтруктураРегистрНакопления.Вставить("ИмяПоляПериода", "Период");
	СтруктураРегистрНакопления.Вставить("ИспользоватьПериод", Истина);
	СтруктураРегистрНакопления.Вставить("ИспользоватьОрганизацию", Истина);
	СтруктураРегистрНакопления.Вставить("ИмяПоляОрганизации", "Организация");
	СтруктураРегистрНакопления.Вставить("ВключитьПодчиненные", Истина);
	ТипыМетаданных.Вставить("РегистрНакопления", СтруктураРегистрНакопления);
	
	// Регистры бухгалтерии
	СтруктураРегистрБухгалтерии = Новый Структура;
	СтруктураРегистрБухгалтерии.Вставить("КоллекцияМетаданных", Метаданные.РегистрыБухгалтерии);
	СтруктураРегистрБухгалтерии.Вставить("ИмяПоляПериода", "Период");
	СтруктураРегистрБухгалтерии.Вставить("ИспользоватьПериод", Истина);
	СтруктураРегистрБухгалтерии.Вставить("ИспользоватьОрганизацию", Истина);
	СтруктураРегистрБухгалтерии.Вставить("ИмяПоляОрганизации", "Организация");
	СтруктураРегистрБухгалтерии.Вставить("ВключитьПодчиненные", Истина);
	ТипыМетаданных.Вставить("РегистрБухгалтерии", СтруктураРегистрБухгалтерии);
	
	// Регистры расчета
	СтруктураРегистрРасчета = Новый Структура;
	СтруктураРегистрРасчета.Вставить("КоллекцияМетаданных", Метаданные.РегистрыРасчета);
	СтруктураРегистрРасчета.Вставить("ИмяПоляПериода", "ПериодРегистрации");
	СтруктураРегистрРасчета.Вставить("ИспользоватьПериод", Истина);
	СтруктураРегистрРасчета.Вставить("ИспользоватьОрганизацию", Истина);
	СтруктураРегистрРасчета.Вставить("ИмяПоляОрганизации", "Организация");
	СтруктураРегистрРасчета.Вставить("ВключитьПодчиненные", Истина);
	ТипыМетаданных.Вставить("РегистрРасчета", СтруктураРегистрРасчета);
	
	// Бизнес-процессы
	СтруктураБизнесПроцесс = Новый Структура;
	СтруктураБизнесПроцесс.Вставить("КоллекцияМетаданных", Метаданные.БизнесПроцессы);
	СтруктураБизнесПроцесс.Вставить("ИмяПоляПериода", "Дата");
	СтруктураБизнесПроцесс.Вставить("ИспользоватьПериод", Истина);
	СтруктураБизнесПроцесс.Вставить("ИспользоватьОрганизацию", Истина);
	СтруктураБизнесПроцесс.Вставить("ИмяПоляОрганизации", "Организация");
	СтруктураБизнесПроцесс.Вставить("ВключитьПодчиненные", Ложь);
	ТипыМетаданных.Вставить("БизнесПроцесс", СтруктураБизнесПроцесс);
	
	// Задачи
	СтруктураЗадача = Новый Структура;
	СтруктураЗадача.Вставить("КоллекцияМетаданных", Метаданные.Задачи);
	СтруктураЗадача.Вставить("ИмяПоляПериода", "Дата");
	СтруктураЗадача.Вставить("ИспользоватьПериод", Истина);
	СтруктураЗадача.Вставить("ИспользоватьОрганизацию", Истина);
	СтруктураЗадача.Вставить("ИмяПоляОрганизации", "Организация");
	СтруктураЗадача.Вставить("ВключитьПодчиненные", Ложь);
	ТипыМетаданных.Вставить("Задача", СтруктураЗадача);
	
	Возврат ТипыМетаданных;
	
КонецФункции

#КонецОбласти

// Обрабатывает все объекты определенного типа метаданных и добавляет их количество в таблицу.
// Перебирает все объекты указанного типа, определяет их свойства и подсчитывает количество записей
// с учетом группировки по организациям и фильтрации по периоду.
//
// Параметры:
//   Таблица - ТаблицаЗначений - таблица результатов (передается по ссылке)
//   ПредставлениеПоВсемОрганизациям - Строка - текст для строк без группировки по организациям
//   ВидОбъекта - Строка - тип объекта метаданных
//   ПараметрыТипа - Структура - конфигурация типа метаданных
//   ПараметрыПериода - Структура - параметры периода для фильтрации
//   ПараметрыПодчиненных - Структура - параметры подчиненных объектов
//
Процедура ДобавитьКоличествоПоТипуМетаданных(Таблица, ПредставлениеПоВсемОрганизациям, 
	ВидОбъекта, ПараметрыТипа, ПараметрыПериода, ПараметрыПодчиненных)
	
	// Для регистров сведений всегда обрабатываем объекты, так как нужно показывать
	// либо все регистры (если ВключитьПодчиненные = Истина), либо только независимые (если Ложь)
	Если ПараметрыТипа.ВключитьПодчиненные И НЕ ПараметрыПодчиненных.ВключитьПодчиненные 
		И ВидОбъекта <> "РегистрСведений" Тогда
		Возврат;
	КонецЕсли;
	
	Для Каждого ОбъектМетаданных Из ПараметрыТипа.КоллекцияМетаданных Цикл
		
		Если НужноПропуститьОбъект(ВидОбъекта, ОбъектМетаданных, ПараметрыПодчиненных) Тогда
			Продолжить;
		КонецЕсли;
		
		ИмяОбъекта = ОбъектМетаданных.Имя;
		СинонимОбъекта = ОбъектМетаданных.Синоним;
		
		ЕстьОрганизация = ОпределитьЕстьОрганизация(ВидОбъекта, ОбъектМетаданных, ПараметрыТипа);
		Периодический = ОпределитьПериодический(ВидОбъекта, ОбъектМетаданных);
		ИспользоватьПериодДляОбъекта = ОпределитьИспользоватьПериод(ПараметрыПериода, 
			ПараметрыТипа, Периодический, ВидОбъекта);
	
	ПараметрыОбъекта = Новый Структура;
	ПараметрыОбъекта.Вставить("ЕстьОрганизация", ЕстьОрганизация);
	ПараметрыОбъекта.Вставить("ИспользоватьПериодДляОбъекта", ИспользоватьПериодДляОбъекта);
	ПараметрыОбъекта.Вставить("ПараметрыТипа", ПараметрыТипа);
	
	ДобавитьКоличествоДляОбъекта(Таблица, ПредставлениеПоВсемОрганизациям, 
		ВидОбъекта, ИмяОбъекта, СинонимОбъекта, ПараметрыОбъекта, ПараметрыПериода);
	
	КонецЦикла;
	
КонецПроцедуры

#Область АнализОбъектовМетаданных

// Определяет, нужно ли пропустить объект при обработке.
// Пропускает подчиненные регистратору объекты регистров сведений, если они не включены в параметрах.
//
// Параметры:
//   ВидОбъекта - Строка - тип объекта метаданных
//   ОбъектМетаданных - ОбъектМетаданных - объект метаданных
//   ПараметрыПодчиненных - Структура - параметры подчиненных объектов
//
// Возвращаемое значение:
//   Булево - Истина, если объект нужно пропустить при обработке
//
Функция НужноПропуститьОбъект(ВидОбъекта, ОбъектМетаданных, ПараметрыПодчиненных)
	
	Если ВидОбъекта <> ВидОбъектаРегистрСведений Тогда
		Возврат Ложь;
	КонецЕсли;
	
	// Для регистров сведений:
	// - Если параметр ВключитьПодчиненные = Ложь (или не установлен), 
	//   то пропускаем подчиненные регистратору регистры (показываем только независимые)
	// - Если параметр ВключитьПодчиненные = Истина, 
	//   то показываем все регистры сведений (и подчиненные, и независимые)
	Возврат НЕ ПараметрыПодчиненных.ВключитьПодчиненные 
		И ОбъектМетаданных.РежимЗаписи = Метаданные.СвойстваОбъектов.РежимЗаписиРегистра.ПодчинениеРегистратору;
	
КонецФункции

// Определяет, есть ли у объекта поле "Организация".
// Для регистров проверяет наличие поля в измерениях, для других объектов - в реквизитах.
// Если тип не использует организацию, возвращает Ложь.
//
// Параметры:
//   ВидОбъекта - Строка - тип объекта метаданных
//   ОбъектМетаданных - ОбъектМетаданных - объект метаданных
//   ПараметрыТипа - Структура - конфигурация типа метаданных
//
// Возвращаемое значение:
//   Булево - Истина, если у объекта есть поле "Организация"
//
Функция ОпределитьЕстьОрганизация(ВидОбъекта, ОбъектМетаданных, ПараметрыТипа)
	
	Если НЕ ПараметрыТипа.ИспользоватьОрганизацию Тогда
		Возврат Ложь;
	КонецЕсли;
	
	Если ЭтоРегистр(ВидОбъекта) Тогда
		Возврат ОбъектМетаданных.Измерения.Найти(ПараметрыТипа.ИмяПоляОрганизации) <> Неопределено;
	Иначе
		Возврат ОбъектМетаданных.Реквизиты.Найти(ПараметрыТипа.ИмяПоляОрганизации) <> Неопределено;
	КонецЕсли;
	
КонецФункции

// Определяет, является ли объект регистром.
// Проверяет, является ли тип одним из видов регистров: сведений, накопления, бухгалтерии или расчета.
//
// Параметры:
//   ВидОбъекта - Строка - тип объекта метаданных
//
// Возвращаемое значение:
//   Булево - Истина, если объект является регистром
//
Функция ЭтоРегистр(ВидОбъекта)
	
	Возврат ВидОбъекта = "РегистрСведений" ИЛИ ВидОбъекта = "РегистрНакопления" 
		ИЛИ ВидОбъекта = "РегистрБухгалтерии" ИЛИ ВидОбъекта = "РегистрРасчета";
	
КонецФункции

// Определяет, является ли объект периодическим или регистром с полем "Период".
//
// Параметры:
//   ВидОбъекта - Строка - тип объекта метаданных
//   ОбъектМетаданных - ОбъектМетаданных - объект метаданных
//
// Возвращаемое значение:
//   Булево - Истина, если объект является периодическим регистром сведений
//            или любым другим регистром с полем "Период"
//
Функция ОпределитьПериодический(ВидОбъекта, ОбъектМетаданных)
	
	Если ВидОбъекта = ВидОбъектаРегистрСведений Тогда
		Возврат ОбъектМетаданных.ПериодичностьРегистраСведений <> 
			Метаданные.СвойстваОбъектов.ПериодичностьРегистраСведений.Непериодический;
	ИначеЕсли ЭтоРегистр(ВидОбъекта) Тогда
		Возврат Истина; 
	Иначе
		Возврат Ложь;
	КонецЕсли;
	
КонецФункции

// Определяет, нужно ли использовать фильтрацию по периоду для объекта.
// Использует период если он включен в настройках, тип метаданных поддерживает период,
// и объект является периодическим или это документ/бизнес-процесс/задача.
//
// Параметры:
//   ПараметрыПериода - Структура - параметры периода
//   ПараметрыТипа - Структура - конфигурация типа метаданных
//   Периодический - Булево - является ли объект периодическим
//   ВидОбъекта - Строка - тип объекта метаданных
//
// Возвращаемое значение:
//   Булево - Истина, если нужно использовать фильтрацию по периоду
//
Функция ОпределитьИспользоватьПериод(ПараметрыПериода, ПараметрыТипа, Периодический, ВидОбъекта)
	
	Возврат ПараметрыПериода.ИспользоватьПериод И ПараметрыТипа.ИспользоватьПериод 
		И (Периодический ИЛИ ВидОбъекта = "Документ" ИЛИ ВидОбъекта = "БизнесПроцесс" 
		ИЛИ ВидОбъекта = "Задача");
	
КонецФункции

#КонецОбласти

#Область ПодсчетКоличестваЗаписей

// Добавляет количество записей для конкретного объекта метаданных.
// Выбирает между группировкой по организациям или общим количеством в зависимости от наличия поля организации.
//
// Параметры:
//   Таблица - ТаблицаЗначений - таблица результатов (передается по ссылке)
//   ПредставлениеПоВсемОрганизациям - Строка - текст для строк без группировки по организациям
//   ВидОбъекта - Строка - тип объекта метаданных
//   ИмяОбъекта - Строка - имя объекта метаданных
//   СинонимОбъекта - Строка - синоним объекта метаданных
//   ПараметрыОбъекта - Структура - параметры объекта
//   ПараметрыПериода - Структура - параметры периода
//
Процедура ДобавитьКоличествоДляОбъекта(Таблица, ПредставлениеПоВсемОрганизациям, 
	ВидОбъекта, ИмяОбъекта, СинонимОбъекта, ПараметрыОбъекта, ПараметрыПериода)
	
	Если ПараметрыОбъекта.ЕстьОрганизация Тогда
		ДобавитьКоличествоПоОрганизациям(Таблица, ВидОбъекта, ИмяОбъекта, СинонимОбъекта, 
			ПараметрыОбъекта, ПараметрыПериода);
	Иначе
		ДобавитьОбщееКоличество(Таблица, ПредставлениеПоВсемОрганизациям, ВидОбъекта, 
			ИмяОбъекта, СинонимОбъекта, ПараметрыОбъекта, ПараметрыПериода);
	КонецЕсли;
	
КонецПроцедуры

// Добавляет количество записей с группировкой по организациям.
// Формирует параметры для запроса с группировкой по организациям, выполняет запрос
// для получения количества по каждой организации и добавляет строку в таблицу для каждой организации.
//
// Параметры:
//   Таблица - ТаблицаЗначений - таблица результатов (передается по ссылке)
//   ВидОбъекта - Строка - тип объекта метаданных
//   ИмяОбъекта - Строка - имя объекта метаданных
//   СинонимОбъекта - Строка - синоним объекта метаданных
//   ПараметрыОбъекта - Структура - параметры объекта
//   ПараметрыПериода - Структура - параметры периода
//
Процедура ДобавитьКоличествоПоОрганизациям(Таблица, ВидОбъекта, ИмяОбъекта, СинонимОбъекта, 
	ПараметрыОбъекта, ПараметрыПериода)
	
	ПараметрыПериодаДляЗапроса = Новый Структура;
	ПараметрыПериодаДляЗапроса.Вставить("ИспользоватьПериод", ПараметрыОбъекта.ИспользоватьПериодДляОбъекта);
	ПараметрыПериодаДляЗапроса.Вставить("НачалоПериода", ПараметрыПериода.НачалоПериода);
	ПараметрыПериодаДляЗапроса.Вставить("КонецПериода", ПараметрыПериода.КонецПериода);
	ПараметрыПериодаДляЗапроса.Вставить("ИмяПоляПериода", ПараметрыОбъекта.ПараметрыТипа.ИмяПоляПериода);
	
	ПараметрыОрганизацииДляЗапроса = Новый Структура;
	ПараметрыОрганизацииДляЗапроса.Вставить("ГруппироватьПоОрганизациям", Истина);
	ПараметрыОрганизацииДляЗапроса.Вставить("ИмяПоляОрганизации", ПараметрыОбъекта.ПараметрыТипа.ИмяПоляОрганизации);
	
	КоличествоПоОрганизациям = ПолучитьКоличествоЗаписейВТаблице(ВидОбъекта, ИмяОбъекта, 
		ПараметрыПериодаДляЗапроса, ПараметрыОрганизацииДляЗапроса);
	
	Для Каждого Стр Из КоличествоПоОрганизациям Цикл
		ДобавитьСтрокуВТаблицуСКоличествомОбъектов(Таблица, ВидОбъекта, ИмяОбъекта, 
			СинонимОбъекта, Стр.Организация, Стр.Количество);
	КонецЦикла;
	
КонецПроцедуры

// Добавляет общее количество записей без группировки по организациям.
// Формирует параметры для запроса без группировки, выполняет запрос для получения
// общего количества и добавляет одну строку в таблицу с общим количеством.
//
// Параметры:
//   Таблица - ТаблицаЗначений - таблица результатов (передается по ссылке)
//   ПредставлениеПоВсемОрганизациям - Строка - текст для строк без группировки по организациям
//   ВидОбъекта - Строка - тип объекта метаданных
//   ИмяОбъекта - Строка - имя объекта метаданных
//   СинонимОбъекта - Строка - синоним объекта метаданных
//   ПараметрыОбъекта - Структура - параметры объекта
//   ПараметрыПериода - Структура - параметры периода
//
Процедура ДобавитьОбщееКоличество(Таблица, ПредставлениеПоВсемОрганизациям, ВидОбъекта, 
	ИмяОбъекта, СинонимОбъекта, ПараметрыОбъекта, ПараметрыПериода)
	
	ПараметрыПериодаДляЗапроса = Новый Структура;
	ПараметрыПериодаДляЗапроса.Вставить("ИспользоватьПериод", ПараметрыОбъекта.ИспользоватьПериодДляОбъекта);
	ПараметрыПериодаДляЗапроса.Вставить("НачалоПериода", ПараметрыПериода.НачалоПериода);
	ПараметрыПериодаДляЗапроса.Вставить("КонецПериода", ПараметрыПериода.КонецПериода);
	ПараметрыПериодаДляЗапроса.Вставить("ИмяПоляПериода", ПараметрыОбъекта.ПараметрыТипа.ИмяПоляПериода);
	
	ПараметрыОрганизацииДляЗапроса = Новый Структура;
	ПараметрыОрганизацииДляЗапроса.Вставить("ГруппироватьПоОрганизациям", Ложь);
	ПараметрыОрганизацииДляЗапроса.Вставить("ИмяПоляОрганизации", ПараметрыОбъекта.ПараметрыТипа.ИмяПоляОрганизации);
	
	Количество = ПолучитьКоличествоЗаписейВТаблице(ВидОбъекта, ИмяОбъекта, 
		ПараметрыПериодаДляЗапроса, ПараметрыОрганизацииДляЗапроса);
	
	ДобавитьСтрокуВТаблицуСКоличествомОбъектов(Таблица, ВидОбъекта, ИмяОбъекта, 
		СинонимОбъекта, ПредставлениеПоВсемОрганизациям, Количество);
	
КонецПроцедуры

#КонецОбласти

// Выполняет универсальный запрос для получения количества записей в таблице объекта.
// Поддерживает фильтрацию по периоду через условие МЕЖДУ и группировку по организациям.
// Универсальный для всех типов объектов метаданных, оптимизирован для минимального количества обращений к БД.
//
// Параметры:
//   ВидОбъекта - Строка - тип объекта метаданных
//   ИмяОбъекта - Строка - имя объекта метаданных
//   ПараметрыПериода - Структура - параметры фильтрации по периоду
//   ПараметрыОрганизации - Структура - параметры группировки по организациям
//
// Возвращаемое значение:
//   - ТаблицаЗначений - при группировке по организациям с колонками: Организация, Количество
//   - Число - общее количество без группировки
//
Функция ПолучитьКоличествоЗаписейВТаблице(ВидОбъекта, ИмяОбъекта, ПараметрыПериода, 
	ПараметрыОрганизации) Экспорт
	
	Запрос = Новый Запрос;
	
	ТекстЗапроса = "ВЫБРАТЬ ";
	
	Если ПараметрыОрганизации.ГруппироватьПоОрганизациям Тогда
		ТекстЗапроса = ТекстЗапроса + "
		|	Т." + ПараметрыОрганизации.ИмяПоляОрганизации + ".Наименование КАК Организация,
		|	КОЛИЧЕСТВО(1) КАК Количество";
	Иначе
		ТекстЗапроса = ТекстЗапроса + "КОЛИЧЕСТВО(*) КАК Количество";
	КонецЕсли;
	
	ТекстЗапроса = ТекстЗапроса + "
	|ИЗ 
	|	" + ВидОбъекта + "." + ИмяОбъекта + " КАК Т";
	
	Условия = "";
	
	Если ПараметрыПериода.ИспользоватьПериод И ПараметрыПериода.НачалоПериода <> Неопределено 
		И ПараметрыПериода.КонецПериода <> Неопределено Тогда
		Условия = "Т." + ПараметрыПериода.ИмяПоляПериода + " МЕЖДУ &НачалоПериода И &КонецПериода";
		Запрос.УстановитьПараметр("НачалоПериода", ПараметрыПериода.НачалоПериода);
		Запрос.УстановитьПараметр("КонецПериода", ПараметрыПериода.КонецПериода);
	КонецЕсли;
	
	Если НЕ ПустаяСтрока(Условия) Тогда
		ТекстЗапроса = ТекстЗапроса + "
		|ГДЕ " + Условия;
	КонецЕсли;
	
	Если ПараметрыОрганизации.ГруппироватьПоОрганизациям Тогда
		ТекстЗапроса = ТекстЗапроса + "
		|СГРУППИРОВАТЬ ПО
		|	Т." + ПараметрыОрганизации.ИмяПоляОрганизации + ".Наименование";
	КонецЕсли;
	
	Запрос.Текст = ТекстЗапроса;
	Результат = Запрос.Выполнить().Выгрузить();
	
	Если ПараметрыОрганизации.ГруппироватьПоОрганизациям Тогда
		Возврат Результат;
	Иначе
		Если Результат.Количество() > 0 Тогда
			Возврат Результат[0].Количество;
		Иначе
			Возврат 0;
		КонецЕсли;
	КонецЕсли;
	
КонецФункции

#Область РаботаСТаблицамиДанных

// Создает таблицу значений с необходимыми колонками для результатов отчета.
//
// Возвращаемое значение:
//   ТаблицаЗначений - пустая таблица с колонками:
//     - ВидОбъекта - Строка - тип объекта метаданных
//     - ИмяОбъекта - Строка - имя объекта метаданных
//     - СинонимОбъекта - Строка - синоним объекта метаданных
//     - Организация - Строка - наименование организации (или "<По всем организациям>")
//     - Количество - Число - количество записей
//     - Приоритет - Число - приоритет для сортировки
//
Функция ИнициализироватьТаблицуСКоличествомОбъектов()
	
	Таблица = Новый ТаблицаЗначений;
	Таблица.Колонки.Добавить("ВидОбъекта");
	Таблица.Колонки.Добавить("ИмяОбъекта");
	Таблица.Колонки.Добавить("СинонимОбъекта");
	Таблица.Колонки.Добавить("Организация");
	Таблица.Колонки.Добавить("Количество");
	Таблица.Колонки.Добавить("Приоритет");
	
	Возврат Таблица;
	
КонецФункции

// Добавляет строку с данными об объекте в таблицу результатов.
// Создает новую строку в таблице и заполняет все поля переданными значениями.
//
// Параметры:
//   Таблица - ТаблицаЗначений - таблица результатов (передается по ссылке)
//   ВидОбъекта - Строка - тип объекта метаданных
//   ИмяОбъекта - Строка - имя объекта метаданных
//   СинонимОбъекта - Строка - синоним объекта метаданных
//   Организация - Строка - наименование организации
//   Количество - Число - количество записей
//
Процедура ДобавитьСтрокуВТаблицуСКоличествомОбъектов(Таблица, ВидОбъекта, ИмяОбъекта, 
	СинонимОбъекта, Организация, Количество)
	
	НоваяСтрока = Таблица.Добавить();
	
	НоваяСтрока.ВидОбъекта = ВидОбъекта;
	НоваяСтрока.ИмяОбъекта = ИмяОбъекта;
	НоваяСтрока.СинонимОбъекта = СинонимОбъекта;
	НоваяСтрока.Организация = Организация;
	НоваяСтрока.Количество = Количество;
	НоваяСтрока.Приоритет = ПолучитьПриоритетТипаМетаданных(ВидОбъекта);
	
КонецПроцедуры

#КонецОбласти

#Область ЗаимствованныеИзБСП_3_1_11_215

#Область ДанныеЭлементаРасшифровки

// см. ОМ.ВариантыОтчетовСлужебный
Функция ДанныеЭлементаРасшифровки(Форма, Расшифровка) 
	
	Если Не РежимВариантаОтчета(Форма.КлючТекущегоВарианта)
		Или Не Форма.НастройкиОтчета.РазрешеноИзменятьВарианты
		Или Не ТипЗнч(Расшифровка) = Тип("ИдентификаторРасшифровкиКомпоновкиДанных") Тогда
		
		Возврат Неопределено;
	КонецЕсли; 
	
	Отчет = Форма.Отчет;
	Документ = Форма.ОтчетТабличныйДокумент;
	ПолеДокумента = Форма.Элементы.ОтчетТабличныйДокумент;
	
	ВыделенныеОбластиДокумента = ПолеДокумента.ПолучитьВыделенныеОбласти();
	
	Данные = ПолучитьИзВременногоХранилища(Форма.ОтчетДанныеРасшифровки);
	ЭлементРасшифровки = Данные.Элементы.Получить(Расшифровка);
	
	Родители = ЭлементРасшифровки.ПолучитьРодителей();
	Родитель = ?(Родители.Количество() = 0, Неопределено, Родители[0]);
	
	Если ТипЗнч(ЭлементРасшифровки) = Тип("ЭлементРасшифровкиКомпоновкиДанныхГруппировка")
		Или ТипЗнч(Родитель) <> Тип("ЭлементРасшифровкиКомпоновкиДанныхГруппировка") Тогда 
	
		ТипЭлементаРасшифровки = ТипЭлементаРасшифровкиГруппировка();
	Иначе
		ТипЭлементаРасшифровки = ТипРеквизит();
	КонецЕсли;
	
	ДанныеЭлементаРасшифровки = Новый Структура;
	ДанныеЭлементаРасшифровки.Вставить("Тип", ТипЭлементаРасшифровки);
	ДанныеЭлементаРасшифровки.Вставить("Настройки", Данные.Настройки);
	ДанныеЭлементаРасшифровки.Вставить("Отбор", ОтборЭлементаРасшифровки(ЭлементРасшифровки));
	ДанныеЭлементаРасшифровки.Вставить("Отборы", ОтборыВыделенныхЭлементовРасшифровки(Документ, 
		ВыделенныеОбластиДокумента, Данные));
	
	Поля = ЭлементРасшифровки.ПолучитьПоля();
	
	Если Поля.Количество() = 0 Тогда
		
		ДанныеЭлементаРасшифровки.Вставить("Значение", Неопределено);
		ДанныеЭлементаРасшифровки.Вставить("Значения", Неопределено);
		ДанныеЭлементаРасшифровки.Вставить("Поле", "");
		
	Иначе 
		
		СвойстваПоля = Поля[0];
		
		ДанныеЭлементаРасшифровки.Вставить("Значение", ?(СвойстваПоля.Значение = Null, Неопределено, СвойстваПоля.Значение));
		ДанныеЭлементаРасшифровки.Вставить("Значения", ДанныеЭлементаРасшифровки.Отборы[СвойстваПоля.Поле]);
		ДанныеЭлементаРасшифровки.Вставить("Поле", СвойстваПоля.Поле);
		
	КонецЕсли;
	
	ДанныеЭлементаРасшифровки.Вставить("ЭтоСсылка", ЭтоСсылка(ТипЗнч(ДанныеЭлементаРасшифровки.Значение)));
	
	ДоступныеВидыСравнения = Новый СписокЗначений;
	
	Если ЗначениеЗаполнено(ДанныеЭлементаРасшифровки.Поле) Тогда
		
		ДоступноеПоле = Отчет.КомпоновщикНастроек.Настройки.ДоступныеПоляВыбора.НайтиПоле(
			Новый ПолеКомпоновкиДанных(ДанныеЭлементаРасшифровки.Поле));
		
		Если ДоступноеПоле = Неопределено Тогда
			
			ДанныеЭлементаРасшифровки.Вставить("ТипЗначения", Тип("Неопределено"));
			ДанныеЭлементаРасшифровки.Вставить("Ресурс", Ложь);
			
		Иначе
			
			ДанныеЭлементаРасшифровки.Вставить("ТипЗначения", ДоступноеПоле.ТипЗначения);
			ДанныеЭлементаРасшифровки.Вставить("Ресурс", ДоступноеПоле.Ресурс);
			
			Если ДанныеЭлементаРасшифровки.Значение = Неопределено Тогда 
				
				Область = ПолеДокумента.ТекущаяОбласть;
				
				Если ТипЗнч(Область) = Тип("ОбластьЯчеекТабличногоДокумента") Тогда 
					
					ДанныеЭлементаРасшифровки.Значение = ДоступноеПоле.ТипЗначения.ПривестиЗначение(Область.Текст);
					ДанныеЭлементаРасшифровки.Значения = ПриведенныеЗначенияВыделенныхОбластей(
						Документ, ВыделенныеОбластиДокумента, ДоступноеПоле.ТипЗначения);
					
				КонецЕсли;
				
			КонецЕсли;
			
		КонецЕсли; 
		
		ДоступноеПолеОтбора = Отчет.КомпоновщикНастроек.Настройки.ДоступныеПоляОтбора.НайтиПоле(
			Новый ПолеКомпоновкиДанных(ДанныеЭлементаРасшифровки.Поле));
		
		Если ДоступноеПолеОтбора <> Неопределено Тогда 
			ДоступныеВидыСравнения = ДоступноеПолеОтбора.ДоступныеВидыСравнения;
		КонецЕсли;
		
	Иначе
		
		ДанныеЭлементаРасшифровки.Вставить("ТипЗначения", Тип("Неопределено"));
		ДанныеЭлементаРасшифровки.Вставить("Ресурс", Ложь);
		
	КонецЕсли; 
	
	Если ДоступныеВидыСравнения.Количество() = 0 Тогда 
		
		Для Каждого Вид Из ВидСравненияКомпоновкиДанных Цикл 
			ДоступныеВидыСравнения.Добавить(Вид);
		КонецЦикла;
		
	КонецЕсли;
	
	Если ДоступныеВидыСравнения.НайтиПоЗначению("СнятьФильтр") = Неопределено Тогда 
		ДоступныеВидыСравнения.Вставить(0, "СнятьФильтр", НСтр("ru = 'Снять фильтр'"));
	КонецЕсли;
	
	Если ДоступныеВидыСравнения.НайтиПоЗначению("ФильтроватьЕще") = Неопределено Тогда 
		ДоступныеВидыСравнения.Добавить("ФильтроватьЕще", НСтр("ru = 'Еще...'"));
	КонецЕсли;
	
	ДанныеЭлементаРасшифровки.Вставить("ДоступныеВидыСравнения", ДоступныеВидыСравнения);
	
	Возврат ДанныеЭлементаРасшифровки;
	
КонецФункции

// см. ОМ.ВариантыОтчетовСлужебный
Функция ОтборЭлементаРасшифровки(ЭлементРасшифровки, Результат = Неопределено)
	
	Если Результат = Неопределено Тогда
		Результат = Новый Соответствие;
	КонецЕсли; 
	
	Если ТипЗнч(ЭлементРасшифровки) = Тип("ЭлементРасшифровкиКомпоновкиДанныхПоля") Тогда
		
		Поля = ЭлементРасшифровки.ПолучитьПоля();
		
		Для каждого Поле Из Поля Цикл
			
			Если Поле.Значение = Null Тогда
				Продолжить;
			КонецЕсли;
			
			Значение = Результат[Поле.Поле];
			
			Если Значение = Неопределено Тогда 
				
				Результат.Вставить(Поле.Поле, Поле.Значение);
				Продолжить;
				
			КонецЕсли;
			
			Значения = ЗначенияСписком(Значение);
			
			Если Значения.НайтиПоЗначению(Поле.Значение) = Неопределено Тогда 
				Значения.Добавить(Поле.Значение);
			КонецЕсли;
			
			Результат.Вставить(Поле.Поле, Значения);
			
		КонецЦикла; 
	КонецЕсли;
	
	Родители = ЭлементРасшифровки.ПолучитьРодителей();
	
	Для Каждого Родитель Из Родители Цикл
		ОтборЭлементаРасшифровки(Родитель, Результат);
	КонецЦикла;
	
	Возврат Результат;
	
КонецФункции

// см. ОМ.ВариантыОтчетовСлужебный
Функция ОтборыВыделенныхЭлементовРасшифровки(Документ, ВыделенныеОбластиДокумента, Данные)
	
	Результат = Новый Соответствие;
	
	Для Каждого ВыделеннаяОбласть Из ВыделенныеОбластиДокумента Цикл
		
		Если ТипЗнч(ВыделеннаяОбласть) <> Тип("ОбластьЯчеекТабличногоДокумента") Тогда
			Продолжить;
		КонецЕсли;
		
		Для НомерСтроки = ВыделеннаяОбласть.Верх По ВыделеннаяОбласть.Низ Цикл 
			
			Область = Документ.Область(НомерСтроки, ВыделеннаяОбласть.Лево, НомерСтроки, ВыделеннаяОбласть.Право);
			
			Если Область.ТипОбласти = ТипОбластиЯчеекТабличногоДокумента.Прямоугольник
				И ТипЗнч(Область.Расшифровка) = Тип("ИдентификаторРасшифровкиКомпоновкиДанных") Тогда 
				
				ЭлементРасшифровки = Данные.Элементы.Получить(Область.Расшифровка);
				ОтборЭлементаРасшифровки(ЭлементРасшифровки, Результат);
				
			КонецЕсли;
			
		КонецЦикла;
		
	КонецЦикла;
	
	Возврат Результат;
	
КонецФункции

// см. ОМ.ВариантыОтчетовСлужебный
Функция ПриведенныеЗначенияВыделенныхОбластей(Документ, ВыделенныеОбластиДокумента, ТипЗначения)
	
	Результат = Новый СписокЗначений;
	
	Для Каждого ВыделеннаяОбласть Из ВыделенныеОбластиДокумента Цикл
		
		Если ТипЗнч(ВыделеннаяОбласть) <> Тип("ОбластьЯчеекТабличногоДокумента") Тогда
			Продолжить;
		КонецЕсли;
		
		Для НомерСтроки = ВыделеннаяОбласть.Верх По ВыделеннаяОбласть.Низ Цикл 
			
			Область = Документ.Область(НомерСтроки, ВыделеннаяОбласть.Лево, НомерСтроки, ВыделеннаяОбласть.Право);
			
			Если Область.ТипОбласти = ТипОбластиЯчеекТабличногоДокумента.Прямоугольник Тогда 
				
				Значение = ТипЗначения.ПривестиЗначение(Область.Текст);
				
				Если Результат.НайтиПоЗначению(Значение) = Неопределено Тогда 
					Результат.Добавить(Значение);
				КонецЕсли;
				
			КонецЕсли;
			
		КонецЦикла;
		
	КонецЦикла;
	
	Возврат Результат;
	
КонецФункции

// см. ОМ.ВариантыОтчетовСлужебныйКлиентСервер
Функция ТипЭлементаРасшифровкиГруппировка() 
	
	Возврат "Группировка";
	
КонецФункции

// см. ОМ.ВариантыОтчетовСлужебныйКлиентСервер
Функция ТипРеквизит()
	
	Возврат "Реквизит";
	
КонецФункции

#КонецОбласти 

// см. ОМ.ВариантыОтчетовСлужебныйКлиентСервер
Функция РежимВариантаОтчета(КлючВарианта) 
	
	Возврат ТипЗнч(КлючВарианта) = Тип("Строка")
		И Не ПустаяСтрока(КлючВарианта);
	
КонецФункции

// см. ОМ.ОбщегоНазначения
Функция ЭтоСсылка(ПроверяемыйТип)
	
	Возврат ПроверяемыйТип <> Тип("Неопределено") И ОписаниеТипаВсеСсылки().СодержитТип(ПроверяемыйТип);
	
КонецФункции

// см. ОМ.СтандартныеПодсистемыПовтИсп
Функция ОписаниеТипаВсеСсылки()
	
	Возврат Новый ОписаниеТипов(Новый ОписаниеТипов(Новый ОписаниеТипов(Новый ОписаниеТипов(Новый ОписаниеТипов(
		Новый ОписаниеТипов(Новый ОписаниеТипов(Новый ОписаниеТипов(Новый ОписаниеТипов(
			Справочники.ТипВсеСсылки(),
			Документы.ТипВсеСсылки().Типы()),
			ПланыОбмена.ТипВсеСсылки().Типы()),
			Перечисления.ТипВсеСсылки().Типы()),
			ПланыВидовХарактеристик.ТипВсеСсылки().Типы()),
			ПланыСчетов.ТипВсеСсылки().Типы()),
			ПланыВидовРасчета.ТипВсеСсылки().Типы()),
			БизнесПроцессы.ТипВсеСсылки().Типы()),
			БизнесПроцессы.ТипВсеСсылкиТочекМаршрутаБизнесПроцессов().Типы()),
			Задачи.ТипВсеСсылки().Типы());
	
КонецФункции

// см. ОМ.ОтчетыКлиентСервер
Функция ЗначенияСписком(Значения, ТолькоЗаполненные = Ложь)
	Если ТипЗнч(Значения) = Тип("СписокЗначений") Тогда
		Список = Значения;
	Иначе
		Список = Новый СписокЗначений;
		Если ТипЗнч(Значения) = Тип("Массив") Тогда
			Список.ЗагрузитьЗначения(Значения);
		ИначеЕсли ЗначениеЗаполнено(Значения) Тогда
			Список.Добавить(Значения);
		КонецЕсли;
	КонецЕсли;
	
	Если Не ТолькоЗаполненные Тогда 
		Возврат Список;
	КонецЕсли;
	
	Индекс = Список.Количество() - 1;
	Пока Индекс >= 0 Цикл 
		Элемент = Список[Индекс];
		Если Не ЗначениеЗаполнено(Элемент.Значение) Тогда 
			Список.Удалить(Элемент);
		КонецЕсли;
		Индекс = Индекс - 1;
	КонецЦикла;
	
	Возврат Список;
КонецФункции

#Область УменьшениеКоличестваПользовательскихНастроек

// см. ОМ.ВариантыОтчетов
Функция НастройкиФормыОтчета(ОтчетСсылка, КлючВарианта, ОтчетОбъект)
	
	ОтчетМетаданные = ОтчетОбъект.Метаданные();
	
	ПредопределенныеВарианты = Новый СписокЗначений;
	Если ОтчетОбъект.СхемаКомпоновкиДанных <> Неопределено Тогда
		Для Каждого Вариант Из ОтчетОбъект.СхемаКомпоновкиДанных.ВариантыНастроек Цикл
			ПредопределенныеВарианты.Добавить(Вариант.Имя, Вариант.Представление);
		КонецЦикла;
	КонецЕсли;
	
	Настройки = НастройкиОтчета(ОтчетСсылка, КлючВарианта, ОтчетОбъект);
	
	Настройки.Вставить("ВариантСсылка", Неопределено);
	Настройки.Вставить("ПредопределенныйСсылка", Неопределено);
	Настройки.Вставить("КлючПредопределенногоВарианта", Неопределено);
	Настройки.Вставить("Пользовательский", Ложь);
	Настройки.Вставить("ТипОтчета", Неопределено);
	Настройки.Вставить("РазрешеноВыбиратьВарианты", Истина);
	Настройки.Вставить("СхемаМодифицирована", Ложь);
	Настройки.Вставить("ПредопределенныеВарианты", ПредопределенныеВарианты);
	Настройки.Вставить("АдресСхемы", "");
	Настройки.Вставить("КлючСхемы", "");
	Настройки.Вставить("Контекстный", Ложь);
	Настройки.Вставить("ПолноеИмя", ОтчетМетаданные.ПолноеИмя());
	Настройки.Вставить("Наименование", СокрЛП(ОтчетМетаданные.Представление()));
	Настройки.Вставить("ОтчетСсылка", ОтчетСсылка);
	Настройки.Вставить("Подсистема", Неопределено);
	Настройки.Вставить("Внешний", ТипЗнч(Настройки.ОтчетСсылка) = Тип("Строка"));
	Настройки.Вставить("Безопасный", БезопасныйРежим() <> Ложь);
	Настройки.Вставить("ИспользуемыеТаблицы", Неопределено);
	Настройки.Вставить("СвойстваРезультата", СвойстваРезультатаОтчета());
	Настройки.Вставить("ИспользуемыеПоляУниверсальногоПоискаПоТипам", Новый Соответствие);
	Настройки.Вставить("СобытияНастроек", Новый Соответствие);
	Настройки.Вставить("ПрочитатьФлажокФормироватьСразуИзПользовательскихНастроек", Истина);
	Настройки.Вставить("НовыеНастройкиXML", Неопределено);
	Настройки.Вставить("НовыеПользовательскиеНастройкиXML", Неопределено);
	Настройки.Вставить("ФормаНастроекРасширенныйРежим", 0);
	Настройки.Вставить("ФормаНастроекИмяСтраницы", "СтраницаОтборы");
	Настройки.Вставить("КлючЗамеров", Неопределено);
	//Настройки.Вставить("Назначение", Перечисления.НазначенияВариантовОтчетов.ДляЛюбыхУстройств);
	Настройки.Вставить("ИспользоватьСнимкиОтчетов", Ложь);
	
	Возврат Настройки;
	
КонецФункции

// см. ОМ.ВариантыОтчетов
Функция НастройкиОтчета(ОтчетСсылка, КлючВарианта, ОтчетОбъект)
	НастройкиОтчета = НастройкиОтчетаПоУмолчанию();
	//
	// ...
	//
	Возврат НастройкиОтчета;
КонецФункции

// см. ОМ.ОтчетыКлиентСервер
Функция НастройкиОтчетаПоУмолчанию() Экспорт
	Настройки = Новый Структура;
	Настройки.Вставить("ФормироватьСразу", Ложь);
	Настройки.Вставить("ВыводитьСуммуВыделенныхЯчеек", Истина);
	Настройки.Вставить("РазрешеноИзменятьСтруктуру", Истина);
	Настройки.Вставить("РазрешеноИзменятьВарианты", Истина);
	Настройки.Вставить("РазрешеноВыбиратьИНастраиватьВариантыБезСохранения", Ложь);
	Настройки.Вставить("ПараметрыРасположенияЭлементовУправления", Неопределено);
	Настройки.Вставить("СкрытьКомандыРассылки", Ложь);
	Настройки.Вставить("РазрешеноЗагружатьСхему", Ложь);
	Настройки.Вставить("РазрешеноРедактироватьСхему", Ложь);
	Настройки.Вставить("РазрешеноВосстанавливатьСтандартнуюСхему", Ложь);
	Настройки.Вставить("ЗагрузитьНастройкиПриИзмененииПараметров", Новый Массив);
	Настройки.Вставить("ПоляПоиска", Новый Массив);
	//Настройки.Вставить("ВариантПредставленияПериода", ПредопределенноеЗначение("Перечисление.ВариантыПредставленияПериода.Стандартный"));
	//Настройки.Вставить("ВариантПериода", ПредопределенноеЗначение("Перечисление.ВариантыПериода.Стандартный"));
	Настройки.Вставить("ОтключитьСтандартноеКонтекстноеМеню", Ложь);
	
	Печать = Новый Структура;
	Печать.Вставить("ПолеСверху", 10);
	Печать.Вставить("ПолеСлева", 10);
	Печать.Вставить("ПолеСнизу", 10);
	Печать.Вставить("ПолеСправа", 10);
	Печать.Вставить("ОриентацияСтраницы", ОриентацияСтраницы.Портрет);
	Печать.Вставить("АвтоМасштаб", Истина);
	Печать.Вставить("МасштабПечати", Неопределено);
	
	Настройки.Вставить("Печать", Печать);
	
	События = Новый Структура;
	События.Вставить("ПриСозданииНаСервере", Ложь);
	События.Вставить("ПередЗагрузкойНастроекВКомпоновщик", Ложь);
	События.Вставить("ПослеЗагрузкиНастроекВКомпоновщик", Ложь);
	События.Вставить("ПередЗагрузкойВариантаНаСервере", Ложь);
	События.Вставить("ПриЗагрузкеВариантаНаСервере", Ложь);
	События.Вставить("ПриЗагрузкеПользовательскихНастроекНаСервере", Ложь);
	События.Вставить("ПередЗаполнениемПанелиБыстрыхНастроек", Ложь);
	События.Вставить("ПослеЗаполненияПанелиБыстрыхНастроек", Ложь);
	События.Вставить("ПриОпределенииПараметровВыбора", Ложь);
	События.Вставить("ПриОпределенииИспользуемыхТаблиц", Ложь);
	События.Вставить("ПриОпределенииСвойствЭлементовФормыНастроек", Ложь);
	События.Вставить("ПриОпределенииОсновныхПолей", Ложь);
	События.Вставить("ПередФормированиемОтчета", Ложь);
	
	Настройки.Вставить("События", События);
	
	Возврат Настройки;
КонецФункции

// см. ОМ.ВариантыОтчетовСлужебный
Функция СвойстваРезультатаОтчета() 
	
	СвойстваРезультата = Новый Структура;
	СвойстваРезультата.Вставить("АдресИндексаСтруктурыОтчета", Неопределено);
	СвойстваРезультата.Вставить("Заголовки", Новый Соответствие);
	СвойстваРезультата.Вставить("ГраницыРазделов", Новый СписокЗначений);
	СвойстваРезультата.Вставить("РолиПолей", Новый Структура);
	СвойстваРезультата.Вставить("ИндексПолей", Новый Соответствие);
	СвойстваРезультата.Вставить("ОсновныеПоля", Новый Массив);
	СвойстваРезультата.Вставить("ИтоговыеНастройки", Неопределено);
	СвойстваРезультата.Вставить("КомпоновщикНастроек", Неопределено);
	СвойстваРезультата.Вставить("КомпоновщикНастроекБезАвтоПолей", Неопределено);
	СвойстваРезультата.Вставить("МакетыОписаны", Ложь);
	СвойстваРезультата.Вставить("ВремяФормирования", 0);
	
	Возврат СвойстваРезультата;
	
КонецФункции

#КонецОбласти

// см. ОМ.ВариантыОтчетов
Функция ГлобальныеНастройки() Экспорт
	Результат = Новый Структура;
	Результат.Вставить("ВыводитьОтчетыВместоВариантов", Ложь);
	Результат.Вставить("ВыводитьОписания", Истина);
	Результат.Вставить("РазрешеноИзменятьВарианты", Истина);
	Результат.Вставить("ВыводитьОбщиеНастройкиКолонтитулов", Истина);
	Результат.Вставить("ВыводитьИндивидуальныеНастройкиКолонтитулов", Истина);
	
	Результат.Вставить("Поиск", Новый Структура);
	Результат.Поиск.Вставить("ПодсказкаВвода", НСтр("ru = 'Наименование, поле или автор отчета'"));
	
	Результат.Вставить("ДругиеОтчеты", Новый Структура);
	Результат.ДругиеОтчеты.Вставить("ЗакрыватьПослеВыбора", Истина);
	Результат.ДругиеОтчеты.Вставить("ПоказыватьФлажок", Ложь);
	
	Возврат Результат;
КонецФункции

#КонецОбласти

#КонецОбласти

#Область Инициализация

ВидОбъектаРегистрСведений = "РегистрСведений";

#КонецОбласти

#КонецЕсли
